import request from '@/utils/request'
import type {
  Notification,
  NotificationListResponse,
  UnreadCountResponse,
  Announcement,
  AnnouncementListResponse,
  CreateAnnouncementRequest,
  UpdateAnnouncementRequest,
  NotificationTemplate,
  TemplateListResponse,
  CreateTemplateRequest,
  UpdateTemplateRequest,
  NotificationSetting,
  UpdateSettingsRequest
} from '@/types/api/notification'
import type { BaseResponse, PaginationResponse } from '@/types/common/response'

/**
 * 通知推送相关API
 */
export const notificationApi = {
  /**
   * 获取通知列表
   * @param params 查询参数
   */
  getNotificationList(params: {
    type?: 'COURSE' | 'CARD' | 'SYSTEM' | 'OTHER'
    isRead?: boolean
    page?: number
    pageSize?: number
  }) {
    return request.get<NotificationListResponse>('/notifications', { params })
  },

  /**
   * 获取未读通知数量
   */
  getUnreadCount() {
    return request.get<UnreadCountResponse>('/notifications/unread-count')
  },

  /**
   * 标记通知为已读
   * @param id 通知ID
   */
  markAsRead(id: number) {
    return request.put<null>(`/notifications/${id}/read`)
  },

  /**
   * 批量标记通知为已读
   * @param notificationIds 通知ID数组
   */
  markBatchAsRead(notificationIds: number[]) {
    return request.put<BaseResponse<null>>('/notifications/read-batch', { notification_ids: notificationIds })
  },

  /**
   * 全部标记为已读
   * @param type 通知类型
   */
  markAllAsRead(type?: 'COURSE' | 'CARD' | 'SYSTEM' | 'OTHER') {
    return request.put<BaseResponse<null>>('/notifications/read-all', { params: { type } })
  },

  /**
   * 删除通知
   * @param id 通知ID
   */
  deleteNotification(id: number) {
    return request.delete<BaseResponse<null>>(`/notifications/${id}`)
  }
}

/**
 * 公告相关API
 */
export const announcementApi = {
  /**
   * 获取公告列表
   * @param params 查询参数
   */
  getAnnouncementList(params: {
    type?: 'NOTICE' | 'EVENT' | 'MAINTENANCE' | 'PROMOTION'
    page?: number
    pageSize?: number
  }) {
    return request.get<BaseResponse<PaginationResponse<Announcement>>>('/announcements', { params })
  },

  /**
   * 获取公告详情
   * @param id 公告ID
   */
  getAnnouncementDetail(id: number) {
    return request.get<BaseResponse<Announcement>>(`/announcements/${id}`)
  },

  /**
   * 创建公告（管理员）
   * @param data 公告信息
   */
  createAnnouncement(data: CreateAnnouncementRequest) {
    return request.post<BaseResponse<null>>('/announcements', data)
  },

  /**
   * 更新公告（管理员）
   * @param id 公告ID
   * @param data 公告信息
   */
  updateAnnouncement(id: number, data: UpdateAnnouncementRequest) {
    return request.put<BaseResponse<null>>(`/announcements/${id}`, data)
  },

  /**
   * 删除公告（管理员）
   * @param id 公告ID
   */
  deleteAnnouncement(id: number) {
    return request.delete<BaseResponse<null>>(`/announcements/${id}`)
  },

  /**
   * 发布公告（管理员）
   * @param id 公告ID
   */
  publishAnnouncement(id: number) {
    return request.post<BaseResponse<null>>(`/announcements/${id}/publish`)
  }
}

/**
 * 通知模板相关API（管理员）
 */
export const templateApi = {
  /**
   * 获取模板列表
   * @param params 查询参数
   */
  getTemplateList(params: { page?: number; pageSize?: number }) {
    return request.get<BaseResponse<TemplateListResponse>>('/notifications/templates', { params })
  },

  /**
   * 创建模板
   * @param data 模板信息
   */
  createTemplate(data: CreateTemplateRequest) {
    return request.post<BaseResponse<null>>('/notifications/templates', data)
  },

  /**
   * 更新模板
   * @param id 模板ID
   * @param data 模板信息
   */
  updateTemplate(id: number, data: UpdateTemplateRequest) {
    return request.put<BaseResponse<null>>(`/notifications/templates/${id}`, data)
  },

  /**
   * 删除模板
   * @param id 模板ID
   */
  deleteTemplate(id: number) {
    return request.delete<BaseResponse<null>>(`/notifications/templates/${id}`)
  }
}

/**
 * 通知设置相关API
 */
export const settingApi = {
  /**
   * 获取通知设置
   */
  getSettings() {
    return request.get<BaseResponse<{ settings: NotificationSetting[] }>>('/notifications/settings')
  },

  /**
   * 更新通知设置
   * @param data 设置信息
   */
  updateSettings(data: UpdateSettingsRequest) {
    return request.put<BaseResponse<null>>('/notifications/settings', data)
  }
}
